//
// Created by nsy on 2020/11/20.
//

_Pragma("once")

#include <opencv2/opencv.hpp>
#include <Eigen/Core>
/**
 * 用于存储相机信息
 */
class CameraInfo {
public:

    /** 相机分辨率 */
    enum CameraResolution{
        HD720 = 720, // 1280 * 720
        HD2K = 1242 // 2208 * 1242
    };

    CameraInfo(CameraResolution resolution=HD720);

    /**
     * 使用默认参数
     * @return SUCCESS
     */
    void useDefaultParams(CameraResolution resolution=HD720);

    /** 设置相机焦距 */
    void setFocal(double focal);

    /** 设置相机焦距*/
    void setFocal(double focal_x, double focal_y);

    /** 获取水平焦距 */
    double getFocalX() const;

    /** 获取垂直焦距 */
    double getFocalY() const;

    /** 设置中心 */
    void setCenter(double center_x, double center_y);
    /** 获取水平中心 */
    double getCenterX() const;
    /** 获取垂直中心 */
    double getCenterY() const;

    /**
     * 获得内参矩阵
     *[focal_x     0     center_x]
     *[   0     focal_y  center_y]
     *[   0        0        1    ]
     * @return 相机内参矩阵
     */
    Eigen::Matrix3d getParamMatrix() const;

    /**
     * 设置位姿变换矩阵
     * @param pose
     * @return
     */
    void setPose(Eigen::Matrix<double, 4, 4> pose);

    /** 获取位姿变换矩阵 */
    Eigen::Matrix<double, 4, 4> getPose();

    Eigen::Matrix<double, 4, 4> getTransformMatrix();

    /** 设置对应照片路径 */
    void setImagePath(std::string path);

    /** 获取对应照片路径 */
    std::string getImagePath();

    /** 获取照片宽度高度 */
    int getWidth() const;
    int getHeight() const;


private:
    /**
     * 相机位姿信息（点云空间到相机空间的映射）
     * pose = [R I] 包含旋转矩阵和平移矩阵
     *      R 为3×3的旋转变换矩阵
     *      I 为3×1的平移变换矩阵
     */
    Eigen::Matrix<double, 4, 4> pose_;

    /**
     * focal_x_ 水平焦距
     * focal_y_ 垂直焦距
     */
    double focal_x_{}, focal_y_{};

    /**
     * center_x_ 水平中心
     * center_y_ 垂直中心
     */
    double center_x_{}, center_y_{};

    /** 照片的路径 */
    std::string image_path_;

    /**
     * width_ 照片宽度
     * height_ 照片高度
     */
    int width_{}, height_{};
};